package business;

import java.util.ArrayList;
import java.util.Iterator;

import persistence.db.DataSet;
import persistence.model.AbstractModel;
import persistence.model.Enseignant;
import persistence.model.StatutEnseignant;
import persistence.model.TypeEnseignement;
import utility.Record;

public class StatutEnseignantBL {
	
	private StatutEnseignant statutE = null;
	ArrayList<String> listeErreurs = null;
	
	public StatutEnseignantBL() {

	}

	public StatutEnseignantBL(int id) {
		statutE = (StatutEnseignant) StatutEnseignant.all().get(id);
	}
	
	/**
	 * @return retourne si la demande d'ajout ou de modification est valide ou non
	 */
	public boolean estValidePourModif(){
		// Verification ajout d un statut deja existant - nb heures equivalent TD positif
		boolean estValide = true;
		boolean existeDeja = false;
		for (AbstractModel statutEns : StatutEnseignant.all())
		{
			StatutEnseignant statutCourant = (StatutEnseignant)statutEns;
			if (statutCourant.getNomStatutEns().equals(statutE.getNomStatutEns())) {
				estValide = false;
				existeDeja = true;
			}
		}
		if (existeDeja) {
			listeErreurs.add("Ce statut d'enseignant existe deja.");
		}
		if (statutE.getNombreHeuresEqTd() < 0) {
			listeErreurs.add("Le nombre d'heures equivalent TD doit etre positif.");
		}
		// S'il y a des erreurs, demande d'ajout non valide, sinon est valide
		if (listeErreurs.isEmpty()) {
			estValide = true;
		} else {
			estValide = false;
		}
		System.out.println(listeErreurs);
		return estValide;
	}
	

	/**
	 * @return retourne si la demande de suppression est valide ou non
	 */
	public boolean estValidePourSuppr(){
		// S'il existe des enseignants associes au statut a supprime : est pas valide
		/* Ensemble des enseignants du statut d'enseignant en cours*/
		DataSet enseignantset = Enseignant.all().filter("fk_ENSEIGNANT_STATUT = "+statutE.getId());
		Iterator<AbstractModel> it = enseignantset.iterator();
		if (it.hasNext()) {
			/* il existe un enseignant concernant ce statut d'enseignant */
			listeErreurs.add("Il y a au moins un enseignant associe à ce statut.");
			return false;
		} else {
			return true;
		}
	}
	
	
	/**
	 * @param id : identifiant du statut enseignant
	 * @param nom : nom du statut enseignant
	 * @param nombreHeureEqTD : nombre d'heure equivalent td
	 */
	public ArrayList<String> ajouterStatutEnseignant(int id, String nom, int nombreHeureEqTD) {
		listeErreurs = new ArrayList<String>();
		statutE = new StatutEnseignant(id, nom, nombreHeureEqTD);
		if (estValidePourModif()) {
			statutE.save();
		}
		System.out.println(listeErreurs);
		return listeErreurs;
	}
	
	/**
	 * @param id : identifiant du statut enseignant
	 * @param nom : nom du statut enseignant
	 * @param nombreHeureEqTD : nombre d'heure equivalent td
	 * @return la liste des erreurs rencontrees
	 */
	public ArrayList<String> modifierStatutEnseignant(int id, String nom, int nombreHeureEqTD) {
		listeErreurs = new ArrayList<String>();
		statutE = new StatutEnseignant(id, nom, nombreHeureEqTD);
		if (estValidePourModif()) {
			statutE.save(id);
		}
		System.out.println(listeErreurs);
		return listeErreurs;
	}
	
	/**
	 * @param id : identifiant du statut enseignant
	 * @return la liste des erreurs rencontrees
	 */
	public ArrayList<String> supprimerStatutEnseignant() {
		listeErreurs = new ArrayList<String>();
		if (estValidePourSuppr()) {
			statutE.delete();
		}
		return listeErreurs;
	}
	
	public int getIdStatutEnseignant() {
		return statutE.getId();
	}

	public void setIdStatutEnseignant(int idStatutEnseignant) {
		statutE.setId(idStatutEnseignant);
	}

	public String getNomStatutEns() {
		return statutE.getNomStatutEns();
	}

	public void setNomStatutEns(String nomStatutEns) {
		statutE.setNomStatutEns(nomStatutEns);
	}

	public float getNombreHeuresEqTd() {
		return statutE.getNombreHeuresEqTd();
	}

	public void setNombreHeuresEqTd(float nombreHeuresEqTd) {
		statutE.setNombreHeuresEqTd(nombreHeuresEqTd);
	}
	
	
	/**
	 * @return une liste de record
	 * chaque record comprenant le nom du statut d'enseignant ainsi que son id
	 */
	public ArrayList<Record> getListeStatutEnseignant()
	{
		ArrayList<Record> listeStatuts = new ArrayList<Record>();
		for (AbstractModel st : StatutEnseignant.all())
		{
			StatutEnseignant statutCourant = (StatutEnseignant)st;
			
			int idStatutEns = statutCourant.getId();
			String nomStatutEns = statutCourant.getNomStatutEns();
			
			listeStatuts.add(new Record(idStatutEns, nomStatutEns));
		}
		
		return listeStatuts;
	}
}
